/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ihmprojet.core.historique;

import ihmprojet.core.model.Arrete;
import ihmprojet.core.model.DelegateTreeOperators;
import ihmprojet.core.model.Sommet;
import java.util.HashMap;
import java.util.Map;

/**
 * @todo pour qui veut! <= Je tente!
 * @author Rémi PIOTAIX <remi.piotaix@gmail.com>
 * @author Nunes thomas <nds.thomas@gmail.com>
 */
public class CopierSommetAction extends AbstractAction {

    private Map<Sommet, Arrete> ssArbre = new HashMap();    //le sous arbre a copier.
    private DelegateTreeOperators<Sommet, Arrete> tree;
    private Sommet sommet;
    private Sommet copie;

    public CopierSommetAction(DelegateTreeOperators<Sommet, Arrete> tree, Sommet cible) {
        this.tree = tree;
        this.sommet = cible;
    }

    @Override
    protected void doInitialize() {
        copie = new Sommet(sommet);
        copierArbre(copie, sommet);
    }

    /**
     * Copie le sous arbre de original sous racine copie
     *
     * @param racineCopie la cible pour la copie.
     * @param original la source du ss arbre.
     */
    protected void copierArbre(Sommet racineCopie, Sommet original) {

        for (Sommet fils : tree.getChildren(original)) {// Pour tout les enfants
            Sommet sommetFilsCopie = new Sommet(fils);  // On duplique le fils
            Arrete a = new Arrete();                    // On duplique l'arrete pere/fils
            ssArbre.put(sommetFilsCopie, a);
            tree.addChild(a, sommetFilsCopie, racineCopie);
            copierArbre(sommetFilsCopie, fils);         //Récursif pour tout le sous arbre
        }
    }

    @Override
    public void doExecute() {
        copierArbre(copie, sommet);
    }

    @Override
    public void doReverse() {
        // On supprime l'arbre en mémoire

        for (Arrete a : ssArbre.values()) {
            tree.removeEdge(a);
        }
        for (Sommet s : ssArbre.keySet()) {
            tree.removeChild(s);
        }
    }

    @Override
    public boolean canReverse() {
        return true;
    }

    @Override
    public boolean canExecute() {
        return true;
    }

    @Override
    public String getNom() {
        return "Copier sommet";
    }
}
